function add(x, y) {
    return((x & 0x7FFFFFFF) + (y & 0x7FFFFFFF)) ^ (x & 0x80000000) ^ (y & 0x80000000);
}

function SHA1hex(num) {
    var sHEXChars = "0123456789abcdef";
    var str = "";
    for(var j = 7; j >= 0; j--)
        str += sHEXChars.charAt((num >> (j * 4)) & 0x0F);
    return str;
}

function AlignSHA1(sIn) {
    var nblk = ((sIn.length + 8) >> 6) + 1,
        blks = new Array(nblk * 16);
    for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
    for(i = 0; i < sIn.length; i++)
        blks[i >> 2] |= sIn.charCodeAt(i) << (24 - (i & 3) * 8);
    blks[i >> 2] |= 0x80 << (24 - (i & 3) * 8);
    blks[nblk * 16 - 1] = sIn.length * 8;
    return blks;
}

function rol(num, cnt) {
    return(num << cnt) | (num >>> (32 - cnt));
}

function ft(t, b, c, d) {
    if(t < 20) return(b & c) | ((~b) & d);
    if(t < 40) return b ^ c ^ d;
    if(t < 60) return(b & c) | (b & d) | (c & d);
    return b ^ c ^ d;
}

function kt(t) {
    return(t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
        (t < 60) ? -1894007588 : -899497514;
}

function SHA1(sIn) {
    var x = AlignSHA1(sIn);
    var w = new Array(80);
    var a = 1732584193;
    var b = -271733879;
    var c = -1732584194;
    var d = 271733878;
    var e = -1009589776;
    for(var i = 0; i < x.length; i += 16) {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;
        var olde = e;
        for(var j = 0; j < 80; j++) {
            if(j < 16) w[j] = x[i + j];
            else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
            t = add(add(rol(a, 5), ft(j, b, c, d)), add(add(e, w[j]), kt(j)));
            e = d;
            d = c;
            c = rol(b, 30);
            b = a;
            a = t;
        }
        a = add(a, olda);
        b = add(b, oldb);
        c = add(c, oldc);
        d = add(d, oldd);
        e = add(e, olde);
    }
    SHA1Value = SHA1hex(a) + SHA1hex(b) + SHA1hex(c) + SHA1hex(d) + SHA1hex(e);
    return SHA1Value.toUpperCase();
}


//和PHP一样的时间戳格式化函数
function date(format, timestamp){
 var a, jsdate=((timestamp) ? new Date(timestamp*1000) : new Date());
 var pad = function(n, c){
  if((n = n + "").length < c){
   return new Array(++c - n.length).join("0") + n;
  } else {
   return n;
  }
 };
 var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
 var txt_ordin = {1:"st", 2:"nd", 3:"rd", 21:"st", 22:"nd", 23:"rd", 31:"st"};
 var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
 var f = {
  // Day
  d: function(){return pad(f.j(), 2)},
  D: function(){return f.l().substr(0,3)},
  j: function(){return jsdate.getDate()},
  l: function(){return txt_weekdays[f.w()]},
  N: function(){return f.w() + 1},
  S: function(){return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th'},
  w: function(){return jsdate.getDay()},
  z: function(){return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0},

  // Week
  W: function(){
   var a = f.z(), b = 364 + f.L() - a;
   var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
   if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
    return 1;
   } else{
    if(a <= 2 && nd >= 4 && a >= (6 - nd)){
     nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
     return date("W", Math.round(nd2.getTime()/1000));
    } else{
     return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
    }
   }
  },

  // Month
  F: function(){return txt_months[f.n()]},
  m: function(){return pad(f.n(), 2)},
  M: function(){return f.F().substr(0,3)},
  n: function(){return jsdate.getMonth() + 1},
  t: function(){
   var n;
   if( (n = jsdate.getMonth() + 1) == 2 ){
    return 28 + f.L();
   } else{
    if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
     return 31;
    } else{
     return 30;
    }
   }
  },

  // Year
  L: function(){var y = f.Y();return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0},
  //o not supported yet
  Y: function(){return jsdate.getFullYear()},
  y: function(){return (jsdate.getFullYear() + "").slice(2)},

  // Time
  a: function(){return jsdate.getHours() > 11 ? "pm" : "am"},
  A: function(){return f.a().toUpperCase()},
  B: function(){
   // peter paul koch:
   var off = (jsdate.getTimezoneOffset() + 60)*60;
   var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
   var beat = Math.floor(theSeconds/86.4);
   if (beat > 1000) beat -= 1000;
   if (beat < 0) beat += 1000;
   if ((String(beat)).length == 1) beat = "00"+beat;
   if ((String(beat)).length == 2) beat = "0"+beat;
   return beat;
  },
  g: function(){return jsdate.getHours() % 12 || 12},
  G: function(){return jsdate.getHours()},
  h: function(){return pad(f.g(), 2)},
  H: function(){return pad(jsdate.getHours(), 2)},
  i: function(){return pad(jsdate.getMinutes(), 2)},
  s: function(){return pad(jsdate.getSeconds(), 2)},
  //u not supported yet

  // Timezone
  //e not supported yet
  //I not supported yet
  O: function(){
   var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
   if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
   return t;
  },
  P: function(){var O = f.O();return (O.substr(0, 3) + ":" + O.substr(3, 2))},
  //T not supported yet
  //Z not supported yet

  // Full Date/Time
  c: function(){return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P()},
  //r not supported yet
  U: function(){return Math.round(jsdate.getTime()/1000)}
 };

 return format.replace(/[\]?([a-zA-Z])/g, function(t, s){
  if( t!=s ){
   // escaped
   ret = s;
  } else if( f[s] ){
   // a date function exists
   ret = f[s]();
  } else{
   // nothing special
   ret = s;
  }
  return ret;
 });
}

/**
 * 签名
 * @param {Object} data
 * @param {Object} key
 */
export var sign = (data, key) => {
	var app_config = {
			"5100": 'ios_app_secret',"5200": 'android_app_secret',"5300": 'h5_app_secret',"5400": 'pc_app_secret',"5600":"3112b8dc20734f002010ba20439c65d7"
			};
	var keys = [];
	for (var a in data) {
	    keys.push(a);
	};
	keys.sort();
	var str = key;
	for (var k in keys) {
		var a = keys[k];
	    str += a+data[a];

	};
	str += app_config[key];
	str = SHA1(str);
	return str;
}
